package logica_de_presentacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashSet;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import comun.Pelicula;
import comun.Usuario;
import comun.ValoracionPelicula;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.gestorPeli;
import logica_de_negocio.gestorValoracionPelicula;


public class internalLPUsus extends JInternalFrame implements ActionListener {
	
	private static final long serialVersionUID = 1L;
	private JTable tablaDatos;
	private JButton jbDetalles,jbValoracion,jbSalir;
	private JScrollPane scrollPane;
	private JPanel jpBotones;
	private Usuario usuarioActual;
	private HashSet<Pelicula> lpValo=new HashSet<Pelicula>();
	
		
	public internalLPUsus(Usuario usuarioActual){
	
	super("Peliculas valoradas por el usaurio --> "+usuarioActual.getUsuario(),true,false,false,false);
	this.usuarioActual=usuarioActual;
	this.setVisible(true);
	this.setSize(500,500);
	this.subCompo();
	
	}
	
	public void subCompo(){
		
		
		this.getContentPane().setLayout(new BorderLayout());
		//TABLA
		
	    //CREAMOS UN SCROLLPANE Y LE ANADIMOS LA TABLA
	    scrollPane = new JScrollPane(tablaDatos); 

	    //ANADIMOS EL SCROLLPANE AL PANEL
	    this.add(scrollPane,"Center"); 
		
		
		jpBotones=new JPanel(new FlowLayout());
			
		
		jbDetalles=new JButton("Ver detalles");
		jbDetalles.addActionListener(this);
		jbDetalles.setMnemonic(KeyEvent.VK_V);
		jbDetalles.setToolTipText("Muestra mas detalles de la pelicula selecionada");
		jpBotones.add(jbDetalles);
		
		jbValoracion=new JButton("Ver Valoracion");
		jbValoracion.addActionListener(this);
		jbValoracion.setMnemonic(KeyEvent.VK_M);
		jbValoracion.setToolTipText("Ver la valoracion del usuario");
		jpBotones.add(jbValoracion);

		
		jbSalir=new JButton("Salir");
		jbSalir.addActionListener(this);
		jbSalir.setMnemonic(KeyEvent.VK_S);
		jbSalir.setToolTipText("Salir  de la tabla");
		jpBotones.add(jbSalir);
		
		this.getContentPane().add(jpBotones,"South");
		
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		
		JButton botonPulsado=(JButton) e.getSource();
		
		if(botonPulsado==jbDetalles){
			
			try{
				String tit=(String) tablaDatos.getValueAt(tablaDatos.getSelectedRow(), 0);
				String dir=(String) tablaDatos.getValueAt(tablaDatos.getSelectedRow(), 2);
				gestorPeli gp =new gestorPeli();
				Pelicula p=gp.getPelicula(gp.getId(tit, dir));
				JOptionPane.showMessageDialog(new Frame(), p.toString());
			}catch (IndexOutOfBoundsException sinEle){
				JOptionPane.showMessageDialog(new Frame(), "No hay niguna fila selecionada");
			}catch(NullPointerException sinEle2){
				JOptionPane.showMessageDialog(new Frame(), "No hay niguna fila selecionada");
			} catch (FaltanDatosEnLaBaseDeDatos e1) {
				JOptionPane.showMessageDialog(new Frame(),
						e1.getFalta());
			} catch (ClassNotFoundException e1) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay informacion en la base de datos");
				this.dispose();
			}

		}
		
		if(botonPulsado==jbValoracion){
			
			try{
				String tit=(String)tablaDatos.getValueAt(tablaDatos.getSelectedRow(), 0);//EN LA PRIMERA COLUMNA SE ENCUENTRA EN TITULO
				String dir=(String) tablaDatos.getValueAt(tablaDatos.getSelectedRow(), 2);
				
					gestorPeli gp=new gestorPeli();
					Pelicula p=gp.getPelicula(gp.getId(tit, dir));
					
					gestorValoracionPelicula gvp=new gestorValoracionPelicula();
					ValoracionPelicula vp=gvp.getValoracionPelicula(usuarioActual.getId_u(), p.getId_p());
					
					JOptionPane.showMessageDialog(new Frame(), vp.toString());
					
			}catch (IndexOutOfBoundsException sinEle){
				JOptionPane.showMessageDialog(new Frame(), "No hay niguna fila selecionada");
			}catch(NullPointerException sinEle2){
				JOptionPane.showMessageDialog(new Frame(), "No hay niguna fila selecionada");
			} catch (FaltanDatosEnLaBaseDeDatos e1) {
				JOptionPane.showMessageDialog(new Frame(),
						e1.getFalta());
			} catch (ClassNotFoundException e1) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay informacion en la base de datos");
				this.dispose();
			}
		}
		//ELIMIAR USU
		
		if(botonPulsado==jbSalir){
			this.dispose();
		}
	}
	
	
	public void cargarPeliculas() throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {//DAMOS LAS PELICULAS GUARDADAS
		
		gestorPeli gp=new gestorPeli();
		gestorValoracionPelicula gvp=new gestorValoracionPelicula();
		HashSet<Integer> idPel=gvp.getValoradas(usuarioActual.getId_u());
		for(Integer i: idPel){
			
			Pelicula p=gp.getPelicula(i);
			lpValo.add(p);
		}
		crearTabla();
		this.setVisible(true);
		this.subCompo();
	}
	
	public void crearTabla(){
		
		tablaDatos=null;//VACIAMOS SI EXISTE ALUGUNA
		myTable tmp=new myTable();
		tablaDatos=new JTable(tmp);		
		
		tablaDatos.setPreferredScrollableViewportSize(new Dimension(200,200));	
		tablaDatos.setEnabled(true);
		
		//QUE PODAMOS SELECIONAR LAS FILAS	
		tablaDatos.setRowSelectionAllowed(true);
	    
	    //QUE SE ACTUALICE (La tabla que contiene)
		tmp.fireTableDataChanged();
		
		//SI QUEREMOS QUE LA TABLA LLENE POR COMPLETO LA VENTANA EN LA ALTURA
		tablaDatos.setFillsViewportHeight(true);
	    
		//CREAR UNA ORDENACION AUTOMATICA
		tablaDatos.setAutoCreateRowSorter(true); 
		
	}
		
	
	class myTable extends AbstractTableModel{

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private String[] columName={"Titulo","Actor principal","Director","Fecha de estreno"};
		private Object[][] data;
		
		public myTable(){
			
			super();	
			setData();
		}
		@Override
		public int getColumnCount() 
        {
            return columName.length;
        }
		@Override
        public int getRowCount() {
            return data.length;
        }
        @Override
        public String getColumnName(int col) {
            return columName[col];
        }
        @Override
        public Object getValueAt(int row, int col) {
        	
            return data[row][col];
        }

		public void setData() {
			
			int filas= lpValo.size();
			int cont=0;
			data=new Object[filas][];
			
			//RELLENO DATOS
			for(Pelicula p: lpValo){
				
				Object[] a={p.getTitulo(),p.getActorPrincipal(),p.getDirector(),p.getFechaEstreno()};
				data [cont]=a;
				cont++;
	
			}
		}
	}
}